home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
amok_lha
/
amok24.lha
/
Clusters
/
Clusters.dok
< prev
next >
Wrap
Text File
|
1993-08-15
|
6KB
|
130 lines
======================================================================
Dokumentation zu "Clusters" Version 1.1
Autor: Nicolas Benezan, Postwiesenstr. 2, D7000 Stuttgart 60
======================================================================
Kopierrecht
Das komplette Packet (Quelltext, Dokumentation und Objectcode) ist
Public Domain Software. Es darf beliebig kopiert und verbreitet werden
solange...
* mein Name und dieser Kopierrechtshinweis erhalten bleiben,
* die Vollständigkeit des ganzen Packets gewährleistet ist, und
* mit dem Vertrieb dieser Software kein Gewinn erwirtschaftet wird.
Die Kommerzielle Nutzung ohne meine ausdrückliche schriftliche
Genehmigung ist untersagt.
Ferner ist allen Personen, die in irgend einer Weise etwas mit "Data
Becker" zu tun haben, insbesondere für "Data Becker" arbeiten oder
deren Produkte verkaufen, jegliche Verwendung dieser Software verboten.
Verbesserungsvorschläge sind stets willkommen. Falls Sie Veränderungen
am Programm vornehmen, dokumentieren Sie diese bitte gut verständlich.
Es würde mich freuen, wenn Sie mich über größere Veränderungen in
Kenntnis setzen würden.
(c) 1988 by Nicolas Benezan.
Übersicht
* Umfang des Packets
* Einleitung
* Beschreibung der Prozeduren
* Das Demomodul "ClusterTest"
Umfang des Pakets
Das komplette Paket "Clusters" beinhaltet folgendes:
* Clusters.dok Diese Dokumentation
* Clusters.def \
* Clusters.mod }Quelltext
* ClusterTest.mod /
* Clusters.sym \
* Clusters.obj }Objectcode
* ClusterTest.obj /
* ClusterTest Demoprogramm
(Stand 19.Aug.1989)
Einleitung
Eine dynamische Speicherverwaltung wie sie es beim Amiga gibt ist etwas
sehr praktisches, wenn man mit Datenstrukturen wie Listen, Bäumen usw.
arbeitet. Allerdings kann es in Extremfällen (wenn man mit sehr vielen
kleinen Speicherblöcken arbeitet) vorkommen, daß das Programm mehr als die
Hälfte seiner Zeit allein mit der Speicherverwaltung verbringt. Da hilft
dann auch der optimierteste AVL-Baum-Algorithmus nichts mehr, das Programm
wird schleppend langsam. Außerdem gibt es einen weiteren unangenehmen
Nebeneffekt: der Speicher unterteilt sich mit der Zeit in immer kleinere
und ungleichmäßigere Abschnitte, was die Performance des ganzen Systems
weiter verschlechtert.
Das Modul Clusters schafft Abhilfe, indem es mehrere kleine Speichereinhei-
ten zu größeren Blöcken (Cluster, engl. Traube) zusammenfasst. Erstens geht
das Allozieren von Speicher (durchschnittlich) schneller, da nur bei einem
Bruchteil der Allocate()-Aufrufe wirklich Speicher vom System angefordert
werden muß, zweitens wird der Speicher nicht so stark zerstückelt, da nur
wenige große Cluster alloziert werden (die übrigens auch bei unterschied-
licher Blockgröße immer die gleiche Gesammtgröße haben).
Beschreibung der Prozeduren
InitMemManager()
----------------
Diese Prozedur muß vor allen anderen aufgerufen werden. Sie initialisiert
die Parameter, mit denen die Speicherverwaltung arbeitet. Es wird je eine
Prozedur angegeben, mit der das Modul Clusters intern Speicher vom System
anfordert bzw. wieder freigibt. Zusätzlich wird noch die Cluster-
Gesammtgröße (ClusterSize) und die Größen der einzelnen Blöcke
(BlockSizes als offener Feldparameter) angegeben. Es wird empfohlen, für
Clustersize möglichst eine Zweierpotenz (512, 1024 oder 2048 usw.) oder
wenigstens ein ganzzahliges Vielfaches von kB zu verwenden, da hierdurch
die Speicherzerstückelung am besten vermindert werden kann.
BlockSizes ist ein offenes Feld der am häufigsten benötigten Blockgrößen
bei Allocate(). Hierbei sollten die am meisten benötigten (die
zeitkritischsten) als erste angegeben werde.
Allocate()
----------
Diese Prozedur ist parameterkompatibel mit den gängigen Allocate-Prozeduren
aus MemSystem, Heap usw. Die Tücke der Implementation ist nach außen
unsichtbar, d.h. die Prozedur verhält sich auch genauso wie gewöhnliche
Allocate-Prozeduren und kann deshalb auch als AllocProc in vielen
Amok-Modulen verwendet werden (siehe z.B. Trees, Lists, AVL uvm.).
Wird mit Allocate() eine Blockgröße angefordert, die im BlockSizes-Feld
(von InitMemManager) enthalten war, dan wird diese auf die oben
beschriebene optimierte Art behandelt. Anderernfalls wird der Block ganz
normal vom systemglobalen Speichervorrat alloziert.
Deallocate()
------------
Dies ist das Gegenstück zu Allocate() und dient dazu, einen mit Allocate()
angeforderten Speicherblock wieder freizugeben. Es muß streng darauf
geachtet werden, daß die Allocate/Deallocate-Prozeduren dieses Moduls nicht
mit anderen gemischt verwendet werden, d.h. das mit Clusters.Deallocate()
nur solcher Speicher freigegeben wird, der auch mit Clusters.Allocate()
alloziert wurde, sonst kann es zu Abstürzen kommen.
FindBlock()
-----------
Diese Prozedur ermöglicht das Auffinden des Clusters, in dem sich ein
bestimmter Block befindet. dabei wird auch die Nummer des Blocks innerhalb
des Clusters errechnet. Der normale Benutzer braucht sich hierum nicht zu
sorgen. Dies ist lediglich für spezielle Erweiterungen von Clusters
vorgesehen (z.B. carbage collection), bei der Blöcke zwischen Clustern
verschoben werden müssen.
Das Demomodul "ClusterTest"
---------------------------
Diese Demo zeigt die interne Arbeitsweise von Clusters. Durch einen
Zufallsgenerator gesteurt werden Allocate() und Deallocate() abwechselnd
aufgerufen. Dabei sieht man sehr schön, wie sich die Cluster allmählich
füllen, durch Deallocate()s Lücken entstehen, die dann durch folgende
Allocate()s wieder gefüllt werden usw. ("·"=freier, "*"=belegter Block).